package com.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;



    // 存储用户名与当前有效令牌的绑定关系
    public void setUserToken(Long id, String token, long expirationMillis) {
        String key = "user:token:" + id;
        // 将毫秒转换为秒（Redis的最小时间单位是秒）
        long seconds = TimeUnit.MILLISECONDS.toSeconds(expirationMillis);
        // 确保至少1秒的过期时间
        if (seconds <= 0) seconds = 1;
        redisTemplate.opsForValue().set(key, token, seconds, TimeUnit.SECONDS);
    }

    // 获取用户当前的有效令牌
    public String getUserToken(Long id) {
        Object value = redisTemplate.opsForValue().get("user:token:" + id);
        return value != null ? value.toString() : null;
    }

    // 删除用户与令牌的绑定关系
    public void removeUserToken(Long id) {
        String key = "user:token:" + id;
        redisTemplate.delete(key);
    }


    public Long lPushMessage(String roomId, String message) {
        String key = "chat:room:" + roomId; // 键格式：chat:room:xxx
        Long length = redisTemplate.opsForList().leftPush(key, message);
        // 设置列表过期时间（24小时），避免无限增长
        redisTemplate.expire(key, 24, TimeUnit.HOURS);
        return length;
    }

    /**
     * 获取房间的历史消息（从旧到新）
     * @param roomId 房间ID
     * @param start 起始索引（0表示第一个元素）
     * @param end 结束索引（-1表示最后一个元素）
     * @return 消息列表（JSON字符串）
     */
    public List<Object> lRangeMessages(String roomId, long start, long end) {
        String key = "chat:room:" + roomId;
        return redisTemplate.opsForList().range(key, start, end);
    }

    /**
     * 获取房间消息列表的长度
     * @param roomId 房间ID
     * @return 列表长度
     */
    public Long lGetMessageSize(String roomId) {
        String key = "chat:room:" + roomId;
        return redisTemplate.opsForList().size(key);
    }

    /**
     * 修剪房间消息列表（只保留指定范围的消息，防止内存溢出）
     * @param roomId 房间ID
     * @param keepCount 保留的消息数量（只保留最新的N条）
     */
    public void lTrimMessages(String roomId, long keepCount) {
        String key = "chat:room:" + roomId;
        // 只保留[0, keepCount-1]范围内的元素（最新的keepCount条消息）
        redisTemplate.opsForList().trim(key, 0, keepCount - 1);
    }
}